<?php

namespace origin;

/**
 * 自动加载类
 * 自动引入PHP文件
 * @author dece <decezz@qq.com>
 */
class Loader
{
    /**
     * 命名空间路径
     * @var string
     */
    protected static $path_arr = [];

    /**
     * 注册命名空间路径
     * @param  array $path_list 路径
     * @return void
     */
    public static function setPath( $path_list )
    {
        if (!is_array($path_list)) {
            return false;
        }
        self::$path_arr = array_merge(self::$path_arr, $path_list);
        return self::$path_arr;
    }

    /**
     * 注册加载
     * @param  string $name 命名空间 (origin 和 origin\lib 属于同一命名空间)
     * @return bool
     */
    public static function autoLoader( $name )
    {
        $class_path = str_replace('\\', DIRECTORY_SEPARATOR, $name);
        if (strpos($name, 'origin\\') === 0) {
            // origin 目录查找
            $class_file = __DIR__ . substr($class_path, strlen('origin')) . '.php';
            if (self::require_file($class_file, $name)) {
                return true;
            }
            // origin/lib 目录查找
            $class_file = __DIR__ . DIRECTORY_SEPARATOR . 'lib' . substr($class_path, strlen('origin')) . '.php';
            if (self::require_file($class_file, $name)) {
                return true;
            }
        }
        if (array_key_exists($name, self::$path_arr)) {
            $the_class = end(explode(DIRECTORY_SEPARATOR, $class_path));
            $path_name = str_replace('\\', DIRECTORY_SEPARATOR, self::$path_arr[$name]);
            $class_file = __DIR__ . DIRECTORY_SEPARATOR . $path_name . DIRECTORY_SEPARATOR . $the_class . '.php';
        }
        // origin 官方目录和注册目录都没有该类则向上一级目录查找
        if (empty($class_file) || !is_file($class_file)) {
            $class_file = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . "$class_path.php";
        }
        if (self::require_file($class_file, $name)) {
            return true;
        }
        return false;
    }

    /**
     * 尝试加载类文件
     * @param  string $class_file 类的路径
     * @param  string $name       类的名称
     * @return bool
     */
    protected static function require_file( $class_file , $name )
    {
        if (is_file($class_file)) {
            require_once($class_file);
            if (class_exists($name, false)) {
                return true;
            }
        }
        return false;
    }
}

spl_autoload_register('\origin\Loader::autoLoader');